Micron Document




Application-Layer Protocol Negotiation
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Application-Layer Protocol Negotiation (ALPN) is a Transport Layer Security (TLS) extension that allows the application layer to negotiate which protocol should be performed over a secure connection in a manner that avoids additional round trips and which is independent of the application-layer protocols. It is used to establish HTTP/2 connections without additional round trips (client and server can communicate over two ports previously assigned to HTTPS with HTTP/1.1 and upgrade to use HTTP/2 or continue with HTTP/1.1 without closing the initial connection).

Contents


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Support

ALPN is supported by these libraries:

BSAFE Micro Edition Suite since version 5.0cite-ref-1[1]
GnuTLS since version 3.2.0 released in May 2013cite-ref-gnutls-3-2-0-2-0[2]
MatrixSSL since version 3.7.1 released in December 2014cite-ref-matrixssl-3-7-1-3-0[3]
Network Security Services since version 3.15.5 released in April 2014cite-ref-nss-3-15-5-4-0[4]
OpenSSL since version 1.0.2 released in January 2015cite-ref-openssl-1-0-2-5-0[5]
LibreSSL since version 2.1.3 released in January 2015cite-ref-libressl-2-1-3-6-0[6]
mbed TLS (previously PolarSSL) since version 1.3.6 released in April 2014cite-ref-polarssl-1-3-6-7-0[7]
s2n since its original public release in June 2015.
wolfSSL (formerly CyaSSL) since version 3.7.0 released in October 2015cite-ref-changelog-8-0[8]
Go (in the standard library crypto/tls package) since version 1.4 released in December 2014cite-ref-go-1-4-9-0[9]
JSSE in Java since JDK 9 released in September 2017,cite-ref-jsse-10-0[10] backported to JDK 8 released in April 2020cite-ref-jsse2-11-0[11]
Win32 SSPI since Windows 8.1 and Windows Server 2012 R2 were released October 18, 2013cite-ref-win32-sspi-12-0[12]

History

Next Protocol Negotiation

In January 2010, Google introduced IETF standard draft describing Next Protocol Negotiation TLS extension.cite-ref-13[13] This extension was used to negotiate experimental SPDY connections between Google Chrome and some of Google's servers. As SPDY evolved, NPN was replaced with ALPN.

Application-Layer Protocol Negotiation

On July 11, 2014, ALPN was published as RFC 7301. ALPN replaces Next Protocol Negotiation (NPN) extension.cite-ref-14[14]

TLS False Start was disabled in Google Chrome from version 20 (2012) onward except for websites with the earlier NPN extension.cite-ref-15[15]

Example

ALPN is a TLS extension which is sent on the initial TLS handshake 'Client Hello', and it lists the protocols that the client (for example the web browser) supports:

Handshake Type: Client Hello (1)
Length: 141
Version: TLS 1.2 (0x0303)
Random: dd67b5943e5efd0740519f38071008b59efbd68ab3114587...
Session ID Length: 0
Cipher Suites Length: 10
Cipher Suites (5 suites)
Compression Methods Length: 1
Compression Methods (1 method)
Extensions Length: 90
[other extensions omitted]
Extension: application_layer_protocol_negotiation (len=14)
Type: application_layer_protocol_negotiation (16)
Length: 14
ALPN Extension Length: 12
ALPN Protocol
ALPN string length: 2
ALPN Next Protocol: h2
ALPN string length: 8
ALPN Next Protocol: http/1.1

The resulting 'Server Hello' from the web server will also contain the ALPN extension, and it confirms which protocol will be used for the HTTP request:

Handshake Type: Server Hello (2)
Length: 94
Version: TLS 1.2 (0x0303)
Random: 44e447964d7e8a7d3b404c4748423f02345241dcc9c7e332...
Session ID Length: 32
Session ID: 7667476d1d698d0a90caa1d9a449be814b89a0b52f470e2d...
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
Compression Method: null (0)
Extensions Length: 22
[other extensions omitted]
Extension: application_layer_protocol_negotiation (len=5)
Type: application_layer_protocol_negotiation (16)
Length: 5
ALPN Extension Length: 3
ALPN Protocol
ALPN string length: 2
ALPN Next Protocol: h2

References

cite-note-11. "Dell BSAFE Micro Edition Suite 5.0 Release Advisory". Retrieved 2022-10-18.
cite-note-gnutls-3-2-0-22. "gnutls 3.2.0". Archived from the original on 2016-01-31. Retrieved 2015-01-26.
cite-note-matrixssl-3-7-1-33. "MatrixSSL - News". 2014-12-04. Archived from the original on 2015-02-14. Retrieved 2015-01-26.
cite-note-nss-3-15-5-44. "NSS 3.15.5 release notes". Mozilla Developer Network. Mozilla. Retrieved 2015-01-26.
cite-note-openssl-1-0-2-55. "OpenSSL 1.0.2 release notes". The OpenSSL Project. 2015-01-22. Archived from the original on 2014-09-04. Retrieved 2015-01-26.
cite-note-libressl-2-1-3-66. "LibreSSL 2.1.3 released". 2015-01-22. Retrieved 2015-01-26.
cite-note-polarssl-1-3-6-77. "Download overview - PolarSSL". 2014-04-11. Archived from the original on 2015-02-09. Retrieved 2015-01-26.
cite-note-changelog-88. "wolfSSL Release Change Log". 2015-10-26. Retrieved 2015-09-11.
cite-note-go-1-4-99. "Go 1.4 Release Notes". 2014-12-10. Retrieved 2017-11-28.
cite-note-jsse-1010. "JEP 244: TLS Application-Layer Protocol Negotiation Extension". 2017-08-07. Retrieved 2018-08-29.
cite-note-jsse2-1111. "Release Note: TLS Application-Layer Protocol Negotiation Extension". 2020-04-30. Retrieved 2020-06-11.
cite-note-win32-sspi-1212. "What's New in TLS/SSL (Schannel SSP)". 31 August 2016. Retrieved 2020-03-30.
cite-note-1313. citereflangley2010Langley, A. (January 20, 2010). "Transport Layer Security (TLS) Next Protocol Negotiation Extension". IETF Datatracker.
cite-note-1414. citereflangleyLangley, Adam. "» NPN and ALPN". Retrieved 2 April 2013.
cite-note-1515. citereflangleyLangley, Adam. "False Start's Failure (11 Apr 2012)". Retrieved 25 September 2013.

External links

• The registry of ALPN protocol IDs is maintained by IANA as a TLS extension.
• draft-agl-tls-nextprotoneg-04 (NPN draft) (last updated: May 2012)
RFC 7301 "Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension"